﻿#include<iostream>

using namespace std;

//值传递
void change1(int n) {
    //形参是实参的拷贝，改变形参的值并不会影响外部实参的值。
    //从被调用函数的角度来说，值传递是单向的（实参->形参），参数的值只能传入
    cout << "值传递--函数操作地址" << &n << endl;         //显示的是拷贝的地址而不是源地址 
    n++;
}

int change1_1(int n) {
    //形参是实参的拷贝，改变形参的值并不会影响外部实参的值。
    //从被调用函数的角度来说，值传递是单向的（实参->形参），参数的值只能传入
    cout << "值传递--函数操作地址" << &n << endl;         //显示的是拷贝的地址而不是源地址 
    n++;
    return n;
    // 出口的值并不会返回到实参当中
}

//引用传递
int change2(int& n) {
    //形参是实参的引用，上面的这个&表示引用，下面这个&表示取址
    cout << "引用传递--函数操作地址" << &n << endl;
    cout << "n=" << n << endl;
    n++;
    return n;
}

void change2_1(int& n) {
    //形参是指向实参的指针
    cout << "引用传递--函数操作地址" << &n << endl;
    n++;
    //return n;
}

//指针传递
void change3(int* n) {
    cout << "指针传递--函数操作地址 " << n << endl;
    cout << "n=" << n << endl;
    cout << "*n=" << *n << endl;
    *n = *n + 1;
}

int change3_1(int* n) {
    cout << "指针传递--函数操作地址 " << n << endl;
    *n = *n + 1;
    return *n;
}

void change3_2(int* n)
{
    n++;
    cout << "*n=" << *n << endl;
    cout << "n=" << n << endl;
    //*n = *n + 1; 会报错
}

void change3_3(int* n)
{
    (*n)++;

    cout << "*n=" << *n << endl;
    cout << "n=" << n << endl;
}

void change4(int* n,int sizen)
{
    //n = n + 2; //不能直接这么做
    n[1] = -1;
    int nsize;
    // 传递进来的数组，数组大小信息就丢失了
    // 因此这里并不能知道真正的下届是多少
    nsize= sizeof( n ) / sizeof(n[0]);

    cout << "size array = "<< nsize << endl;
    cout << "size array = " << sizen << endl;
    for (int i = 0; i < sizen; i++)
    {
        n[i] = n[i] + 10;
        cout << n[i] << endl;
    }
}

int main()
{
    cout << "Hello CMake. " << endl;

    int n = 10;
    cout << "实参的值" << n << endl;
    cout << "实参的地址" << &n << endl;

    cout << "===========================================" << endl;

    //值传递
    change1(n);
    cout << "after change1() n=" << n << endl;

    change1_1(n);
    cout << "change1_1=" << change1_1(n) << endl;
    cout << "after change1_1() n=" << n << endl;

    cout << "===========================================" << endl;

    //引用传递
    change2(n);
    cout << "after change2() n=" << n << endl;

    change2_1(n);
    cout << "after change2_1() n=" << n << endl;

    cout << "===========================================" << endl;
    //指针传递
    change3(&n);
    cout << "after change3() n=" << n << endl;

    change3_1(&n);
    cout << "after change3_1() n=" << n << endl;

    cout << "after change3_1() n=" << change3_1(&n) << endl;

    change3_2(&n);
    cout << "after change3_2() n=" << n << endl;

    change3_3(&n);
    cout << "after change3_3() n=" << n << endl;

    cout << "===========================================" << endl;
    int arr[4] = {0};
    int sizen =  sizeof(arr) / sizeof(arr[0]);
    cout << "sizeof = "<<sizen << endl;

    change4(arr,sizen);

    return 0;

}